package com.agrm.comment.controller;

import com.agrm.comment.service.CommentService;

import com.agrm.model.comment.dto.CommentQuery;
import com.agrm.model.comment.pojo.Comment;
import com.agrm.model.common.dtos.PageRequestDto;
import com.agrm.model.common.dtos.PageResponseResult;
import com.agrm.model.common.dtos.ResponseResult;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

@RestController
@RequestMapping("/api/v1/comment")
public class CommentController {
    //todo 评论redis缓存 // 待实现：评论功能的Redis缓存优化

    @Autowired // 自动注入CommentService实例
    private CommentService commentService;

    /**
     * 根据ID获取评论信息
     *
     * @param id 评论ID
     * @return 返回包含评论信息的ResponseResult
     */
    @GetMapping("/get") // 映射GET请求，用于获取单个评论
    public ResponseResult findById(@RequestParam("id") Integer id) {
        return ResponseResult.okResult(commentService.getById(id)); // 调用服务层方法并返回结果
    }


    /**
     * 获取所有评论信息
     *
     * @return 返回包含所有评论信息的ResponseResult
     */
    @GetMapping("/getAll") // 映射GET请求，用于获取所有评论
    public ResponseResult findAll() {
        return ResponseResult.okResult(commentService.list()); // 调用服务层方法并返回结果
    }

    /**
     * 分页查询评论信息
     *
     * @param page  分页请求参数
     * @param query 评论查询条件
     * @return 返回分页后的评论信息
     */
    @GetMapping("/list") // 映射GET请求，用于分页查询评论
    public PageResponseResult list(PageRequestDto page, CommentQuery query) {

        // 调用服务层方法获取分页数据
        IPage<Comment> pages = commentService.queryList(page, query);
        PageResponseResult pageResponseResult = new PageResponseResult(page.getPage(), page.getSize(), (int) pages.getTotal());
        pageResponseResult.setData(pages.getRecords()); // 注意这里改为getRecords()

        return pageResponseResult;
    }

    /**
     * 点赞功能接口
     *
     * @param id 请求参数，表示被点赞内容的ID，通过@RequestParam注解获取
     * @return 返回一个ResponseResult对象，包含点赞操作的结果
     * @PutMapping 注解表示这是一个HTTP PUT请求映射，路径为"/like"
     */
    @PutMapping("/like")
    public ResponseResult like(@RequestParam("id") Integer id) {
        // 调用commentService的like方法处理点赞逻辑，并将结果封装在ResponseResult中返回
        return ResponseResult.okResult(commentService.like(id));
    }


    /**
     * 更新评论接口
     * 通过接收前端传来的评论对象，更新数据库中的评论信息
     * 并在更新时自动设置更新时间为当前时间
     *
     * @param comment 包含更新后评论信息的对象，由前端通过请求体传递
     * @return 返回更新操作的结果，包含更新后的评论信息
     */
    // 创建分页响应对象
    @PutMapping("/update")
    public ResponseResult update(@RequestBody Comment comment) {
        // 设置评论的更新时间为当前系统时间
        comment.setUpdatedAt(LocalDateTime.now());
        // 调用评论服务层更新方法，并返回操作结果
        return ResponseResult.okResult(commentService.updateById(comment));
    }

    /**
     * 删除评论接口
     * 通过接收评论ID列表，批量删除对应的评论记录
     *
     * @param ids 评论ID列表，使用@RequestBody注解接收前端传递的JSON数组
     * @return 返回操作结果，包含删除是否成功的状态信息
     */
    @DeleteMapping("/delete")    // 定义HTTP DELETE请求映射，指定请求路径为"/delete"
    public ResponseResult delete(@RequestBody List<Integer> ids) {    // 接收前端传递的评论ID列表
        return ResponseResult.okResult(commentService.removeBatchByIds(ids));    // 调用服务层批量删除方法，并返回操作结果
    }

    /**
     * 添加评论的接口方法
     *
     * @param comment 接收从前端传递过来的评论信息，使用@RequestBody注解将请求体映射到Comment对象
     * @return 返回一个ResponseResult对象，包含操作结果和评论信息
     */
    @PostMapping("/add")
    public ResponseResult add(@RequestBody Comment comment) {
        // 设置评论的创建时间为当前系统时间
        comment.setCreatedAt(LocalDateTime.now());
        // 设置评论的更新时间为当前系统时间
        comment.setUpdatedAt(LocalDateTime.now());
        // 调用commentService的save方法保存评论，并将结果封装到ResponseResult中返回
        return ResponseResult.okResult(commentService.save(comment));
    }




    /**
     * 8.30
     * 获取评论树结构接口方法
     */

    /**
     * 分页查询评论列表
     */
//    @PostMapping("/list")
//    public ResponseResult<Page<Comment>> queryList(@RequestBody PageRequestDto page,
//                                                   @RequestParam(required = false) CommentQuery query) {
//        Page<Comment> result = commentService.queryList(page, query);
//        return ResponseResult.okResult(result);
//    }

    /**
     * 获取所有评论（带缓存）
     */
    @GetMapping("/list/all")
    public ResponseResult<List<Comment>> findAll2() {
        List<Comment> result = commentService.findAll();
        return ResponseResult.okResult(result);
    }

    /**
     * 根据条件查询评论
     */
    @PostMapping("/list/condition")
    public ResponseResult<List<Comment>> findAll(@RequestBody Comment comment) {
        List<Comment> result = commentService.findAll(comment);
        return ResponseResult.okResult(result);
    }

    /**
     * 构建评论树结构（带缓存）
     */
    @GetMapping("/tree")
    public ResponseResult<List<Comment>> findTree() {
        List<Comment> result = commentService.findTree();
        return ResponseResult.okResult(result);
    }

    /**
     * 根据商品ID构建评论树（带缓存）
     */
    @GetMapping("/tree/good/{goodId}")
    public ResponseResult<List<Comment>> findTreeByGoodId(@PathVariable Integer goodId) {
        List<Comment> result = commentService.findTreeByGoodId(goodId);
        return ResponseResult.okResult(result);
    }

    /**
     * 根据ID查找评论（带缓存）
     */
    @GetMapping("/{id}")
    public ResponseResult<Comment> findById2(@PathVariable Integer id) {
        Comment result = commentService.findById(id);
        return ResponseResult.okResult(result);
    }

    /**
     * 发布评论
     */
    @PostMapping
    public ResponseResult<Boolean> save(@RequestBody Comment comment) {
        boolean result = commentService.save(comment);
        return result ? ResponseResult.okResult(true) : ResponseResult.errorResult(500, "评论发布失败");
    }

    /**
     * 更新评论
     */
//    @PutMapping
//    public ResponseResult<Boolean> update(@RequestBody Comment comment) {
//        boolean result = commentService.update(comment);
//        return result ? ResponseResult.okResult(true) : ResponseResult.errorResult(500, "评论更新失败");
//    }

    /**
     * 删除评论
     */
    @DeleteMapping("/{id}")
    public ResponseResult<Integer> deleteById(@PathVariable Integer id) {
        int result = commentService.deleteById(id);
        return ResponseResult.okResult(result);
    }

    /**
     * 点赞评论
     */
//    @PutMapping("/like/{id}")
//    public ResponseResult<Boolean> like(@PathVariable Integer id) {
//        boolean result = commentService.like(id);
//        return result ? ResponseResult.okResult(true) : ResponseResult.errorResult(500, "点赞失败");
//    }
}
